Many program analysis problems involve propagating abstract values, which are compile-time approximations of the actual values computed by a program. A convenient structure for doing program analysis includes a dependence flow graph wherein nodes in the graph represents statements in the program and there is an edge from each statement that defines (writes) a storage location to a statement that uses (reads) the storage location. When there are many definitions and uses of a storage location, the number of edges in such a dependence flow graph becomes large relative to the number of nodes. This affects both the storage and time required to perform a program analysis using the graph.